package com.yt.setclaim.server.api.cms;

import com.yt.common.constant.Result;
import com.yt.setclaim.models.entity.ClaimCalc;
import com.yt.setclaim.models.entity.MedicalReview;
import com.yt.setclaim.models.service.ClaimCalcService;
import com.yt.setclaim.models.service.MedicalReviewService;
import com.yt.setclaim.models.vo.ClaimCalcVO;
import com.yt.setclaim.models.vo.MedicalReviewVO;
import com.yt.setclaim.models.dto.ClaimCalcDTO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/cms/setclaim-calc")
public class ClaimCalcController {

    @Autowired
    private ClaimCalcService claimCalcService;
    
    @Autowired
    private MedicalReviewService medicalReviewService;

    /**
     * 获取所有已核算的理赔记录
     */
    @GetMapping("/list")
    public Result<List<ClaimCalcVO>> list() {
        List<ClaimCalc> list = claimCalcService.list();
        List<ClaimCalcVO> voList = list.stream().map(claimCalc -> {
            ClaimCalcVO vo = new ClaimCalcVO();
            BeanUtils.copyProperties(claimCalc, vo);
            // ID转换为字符串类型
            vo.setCalcId(String.valueOf(claimCalc.getCalcId()));
            vo.setReviewId(String.valueOf(claimCalc.getReviewId()));
            vo.setAdminId(String.valueOf(claimCalc.getAdminId()));
            // 业务字段转换为字符串类型
            if (claimCalc.getBaseAmount() != null) {
                vo.setBaseAmount(String.valueOf(claimCalc.getBaseAmount()));
            }
            if (claimCalc.getTotalDeduct() != null) {
                vo.setTotalDeduct(String.valueOf(claimCalc.getTotalDeduct()));
            }
            if (claimCalc.getPayRatio() != null) {
                vo.setPayRatio(String.valueOf(claimCalc.getPayRatio()));
            }
            if (claimCalc.getPayAmount() != null) {
                vo.setPayAmount(String.valueOf(claimCalc.getPayAmount()));
            }
            return vo;
        }).collect(Collectors.toList());
        return Result.success(voList);
    }

    /**
     * 获取待核算的医疗审核记录（已审核通过但未核算的记录）
     */
    @GetMapping("/pending-list")
    public Result<List<MedicalReviewVO>> getPendingReviews() {
        // 获取所有已审核通过但未核算的医疗审核记录
        return Result.success(claimCalcService.getPendingReviews());
    }

    /**
     * 根据ID获取理赔核算记录
     */
    @GetMapping("/info/{id}")
    public Result<ClaimCalcVO> info(@PathVariable("id") Integer id) {
        ClaimCalc claimCalc = claimCalcService.getById(id);
        ClaimCalcVO vo = new ClaimCalcVO();
        BeanUtils.copyProperties(claimCalc, vo);
        // ID转换为字符串类型
        vo.setCalcId(String.valueOf(claimCalc.getCalcId()));
        vo.setReviewId(String.valueOf(claimCalc.getReviewId()));
        vo.setAdminId(String.valueOf(claimCalc.getAdminId()));
        return Result.success(vo);
    }

    /**
     * 根据审核ID获取理赔核算记录
     */
    @GetMapping("/info-by-review/{reviewId}")
    public Result<ClaimCalcVO> infoByReviewId(@PathVariable("reviewId") Integer reviewId) {
        ClaimCalc claimCalc = claimCalcService.getByReviewId(reviewId);
        if (claimCalc == null) {
            return Result.fail("未找到对应的理赔核算记录");
        }
        ClaimCalcVO vo = new ClaimCalcVO();
        BeanUtils.copyProperties(claimCalc, vo);
        // ID转换为字符串类型
        vo.setCalcId(String.valueOf(claimCalc.getCalcId()));
        vo.setReviewId(String.valueOf(claimCalc.getReviewId()));
        vo.setAdminId(String.valueOf(claimCalc.getAdminId()));
        return Result.success(vo);
    }

    /**
     * 添加理赔核算记录（核算功能）
     */
    @PostMapping("/calculate")
    public Result<String> calculate(@RequestBody ClaimCalcDTO claimCalcDTO) {
        // 检查是否已完成医疗审核
        MedicalReview medicalReview = medicalReviewService.getById(Integer.valueOf(claimCalcDTO.getReviewId()));
        if (medicalReview == null) {
            return Result.fail("未找到对应的医疗审核记录");
        }

        // 检查是否已存在该审核的核算记录
        ClaimCalc existingCalc = claimCalcService.getByReviewId(Integer.valueOf(claimCalcDTO.getReviewId()));
        if (existingCalc != null) {
            return Result.fail("该医疗审核已存在理赔核算记录");
        }

        ClaimCalc claimCalc = new ClaimCalc();
        BeanUtils.copyProperties(claimCalcDTO, claimCalc);
        // ID转换为Integer类型
        if (claimCalcDTO.getCalcId() != null) {
            claimCalc.setCalcId(Integer.valueOf(claimCalcDTO.getCalcId()));
        }
        if (claimCalcDTO.getReviewId() != null) {
            claimCalc.setReviewId(Integer.valueOf(claimCalcDTO.getReviewId()));
        }
        if (claimCalcDTO.getAdminId() != null) {
            claimCalc.setAdminId(Integer.valueOf(claimCalcDTO.getAdminId()));
        }
        claimCalcService.save(claimCalc);
        return Result.success("核算成功");
    }

    /**
     * 修改理赔核算记录
     */
    @PostMapping("/update")
    public Result<String> update(@RequestBody ClaimCalcDTO claimCalcDTO) {
        ClaimCalc claimCalc = new ClaimCalc();
        BeanUtils.copyProperties(claimCalcDTO, claimCalc);
        // ID转换为Integer类型
        if (claimCalcDTO.getCalcId() != null) {
            claimCalc.setCalcId(Integer.valueOf(claimCalcDTO.getCalcId()));
        }
        if (claimCalcDTO.getReviewId() != null) {
            claimCalc.setReviewId(Integer.valueOf(claimCalcDTO.getReviewId()));
        }
        if (claimCalcDTO.getAdminId() != null) {
            claimCalc.setAdminId(Integer.valueOf(claimCalcDTO.getAdminId()));
        }
        claimCalcService.updateById(claimCalc);
        return Result.success("修改成功");
    }

    /**
     * 删除理赔核算记录
     */
    @PostMapping("/delete")
    public Result<String> delete(@RequestBody ClaimCalcDTO claimCalcDTO) {
        claimCalcService.removeById(Integer.valueOf(claimCalcDTO.getCalcId()));
        return Result.success("删除成功");
    }
}